package com.microframework.netty.manager;

import io.netty.channel.Channel;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.microframework.netty.model.ClientSession;

/**
 * 会话管理器 - 负责客户端会话的增删查改
 */
public class SessionManager {
    // 按Channel存储会话的线程安全Map
    private static final Map<Channel, ClientSession> channelSessionMap = new ConcurrentHashMap<>();
    
    // 按客户端ID存储会话的线程安全Map
    private static final Map<String, ClientSession> idSessionMap = new ConcurrentHashMap<>();

    /**
     * 添加新会话
     * @param session 客户端会话对象
     * @throws IllegalArgumentException 如果会话或通道为null
     */
    public static void addSession(ClientSession session) {
        if (session == null || session.getChannel() == null) {
            throw new IllegalArgumentException("会话和通道不能为null");
        }
        
        channelSessionMap.put(session.getChannel(), session);
        idSessionMap.put(session.getClientId(), session);
        // 这里可以添加会话创建后的初始化逻辑
    }

    /**
     * 根据通道移除会话
     * @param channel 要移除的会话对应的通道
     */
    public static void removeSession(Channel channel) {
        if (channel == null) {
            return;
        }
        
        ClientSession session = channelSessionMap.remove(channel);
        if (session != null) {
            idSessionMap.remove(session.getClientId());
            // 这里可以添加会话销毁前的清理逻辑
        }
    }

    /**
     * 根据通道获取会话
     * @param channel 要查找的通道
     * @return 对应的会话对象，找不到返回null
     */
    public static ClientSession getSession(Channel channel) {
        return channelSessionMap.get(channel);
    }

    /**
     * 根据客户端ID获取会话
     * @param clientId 要查找的客户端ID
     * @return 对应的会话对象，找不到返回null
     */
    public static ClientSession getSession(String clientId) {
        return idSessionMap.get(clientId);
    }

    /**
     * 检查指定通道是否存在会话
     * @param channel 要检查的通道
     * @return 存在返回true，否则false
     */
    public static boolean containsSession(Channel channel) {
        return channelSessionMap.containsKey(channel);
    }

    /**
     * 获取当前活跃会话数量
     * @return 会话总数
     */
    public static int getSessionCount() {
        return channelSessionMap.size();
    }
}